package org.pizza.dlock.distributed.lock.api;


/**
 * @author 高巍
 * @date 2020-01-31 3:27 下午
 */
public interface DistributedLock {

    /**
     * 此方法没有等待时间所以不会阻塞，没有锁过期时间，但是会默认使用看门狗的30秒作为超时时间，
     * 并构建一个定时任务自动续约，续约的条件是业务执行时间大于默认时间的2/3，即20秒时自动续约，重新续约的时间为30秒
     * @param key 上锁的Key
     * @return 结果
     */
    boolean tryLock(String key);

    /**
     * 解锁
     * @param key 上锁的Key
     */
    void unlock(String key);

    /**
     * 没有锁过期时间，所以续约策略如上
     * @param key 上锁的Key
     * @param waitTime 阻塞等待时间
     * @return 结果
     */
    boolean tryLock(String key, Long waitTime);

    /**
     * 有阻塞等待时间，有锁过期时间，没有自动续约策略，即业务执行时间超过锁的过期时间，锁也将被自动释放
     * @param key  上锁的Key
     * @param waitTime 阻塞等待时间
     * @param leaseTime 持有锁过期时间
     * @return 结果
     */
    boolean tryLock(String key, Long waitTime, Long leaseTime);
}
